package demo01;

/*
 *  throw关键字
 *  作用：
 *      可以使用throw关键字在指定的方法中抛出指定的因此
 *  使用格式：
 *      throw new xxxException("异常产生的原因");
 *  注意：
 *      1. throw关键字必须写在方法的内部
 *      2. throw关键字后边new的对象必须时Exception或Exception的子类对象
 *      3. throw关键字抛出指定的异常对象之后，旧必须处理这个异常对象
 *          如果throw关键字后边创建的是RuntimeException或RuntimeException的子类对象，可以不处理，默认交给JVM处理（打印异常对象并中断程序）
 *          如果throw关键字后边创建的是编译异常（写代码时提示的异常），那么必须处理该异常，要么使用throws声明异常，要么try...catch处理异常
 */
public class Demo03Throw {
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3 };
        // System.out.println(getElement(null, 0)); // NullPointerException: 数组参数为空！
        System.out.println(getElement(arr, 3)); // ArrayIndexOutOfBoundsException: 下标参数超出数组范围！
    }

    private static int getElement(int[] arr, int i) {
        /*
         *  对参数进行合法性判断，如果参数不合法，则抛出异常
         */
        if (arr == null) { // arr数组参数：如果为空，抛出空指针异常
            throw new NullPointerException("数组参数为空！");
        }
        if (i < 0 || i > arr.length - 1) { // i下标参数：如果超出数组下标范围，抛出数组下标越界异常
            throw new ArrayIndexOutOfBoundsException("下标参数超出数组范围！");
        }

        return arr[i];
    }
}
